package org.TCC_NOVO.client.visual;

import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Function;
import com.gwtext.client.data.FieldDef;
import com.gwtext.client.data.IntegerFieldDef;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.RecordDef;
import com.gwtext.client.data.Store;
import com.gwtext.client.data.StringFieldDef;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.Tool;
import com.gwtext.client.widgets.Toolbar;
import com.gwtext.client.widgets.ToolbarButton;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.grid.ColumnConfig;
import com.gwtext.client.widgets.grid.ColumnModel;
import com.gwtext.client.widgets.grid.GridPanel;
import com.gwtext.client.widgets.grid.event.GridCellListenerAdapter;
import java.util.ArrayList;
import java.util.Date;
import org.TCC_NOVO.client.modelo.Atividade_Roteiro;
import org.TCC_NOVO.client.GWTServiceAsync;
import org.TCC_NOVO.client.modelo.OcorrenciaTarefa;

public class AssumirTarefasPanel extends Panel{
    private final GWTServiceAsync controller;
    private final String IDF_Usuario;

    AssumirTarefasPanel self;

    //Tela Master
    Store storeMaster;
    GridPanel gridMaster;
    RecordDef recordDefMaster;
    Toolbar toolbar;

    //Tela detalhe
    GridPanel gridDetalhe;
    Store storeDetalhe;
    RecordDef recordDefDetalhe;

    ArrayList<Atividade_Roteiro> ArrayTarefas = new ArrayList();
    ArrayList<OcorrenciaTarefa> ArrayOcorTarefas = new ArrayList();

    public AssumirTarefasPanel(GWTServiceAsync controller, String IDF_Usua) {
        this.controller = controller;
        this.IDF_Usuario = IDF_Usua;
        this.self = this;
        this.init();
    }

    private void init(){
        this.setBorder(true);
        this.setPaddings(2);

        recordDefMaster = new RecordDef(new FieldDef[]{
            new IntegerFieldDef("ID"),
            new IntegerFieldDef("IDF_Unidade"),
            new StringFieldDef("projeto"),
            new StringFieldDef("unidade"),
            new StringFieldDef("titulo"),
            new StringFieldDef("descricao"),
            new StringFieldDef("data_Entrega"),
            new StringFieldDef("responsavel"),
            new StringFieldDef("status"),
            new StringFieldDef("IDF_Resp"),
            new StringFieldDef("data_Entrega_Form"),
        });

        storeMaster = new Store(recordDefMaster);
        gridMaster = new GridPanel();
        gridMaster.setStore(storeMaster);

        ColumnConfig[] columns = new ColumnConfig[]{
            new ColumnConfig("Nome Projeto", "projeto", 120, true),
            new ColumnConfig("Nome Unidade", "unidade", 190, true),
            new ColumnConfig("Título", "titulo", 150, true),
            new ColumnConfig("Descrição", "descricao", 270, true),
            new ColumnConfig("Status", "status", 120, true),
            new ColumnConfig("Data Entrega", "data_Entrega", 90, true),
            new ColumnConfig("Responsável", "responsavel", 90, true),
        };

        ColumnModel columnModel = new ColumnModel(columns);
        gridMaster.setColumnModel(columnModel);
        gridMaster.setFrame(true);
        gridMaster.setTitle("Tarefas");
        gridMaster.setStripeRows(true);
        gridMaster.setSize(1020, 280);
        gridMaster.setAutoScroll(true);
        gridMaster.addTool(new Tool(Tool.REFRESH, new Function() {
            @Override
            public void execute() {
                gridMaster.getEl().mask("Carregando", "x-mask-loading");
                CarrgarGridMaster();
                Timer timer = new Timer() {
                    @Override
                    public void run() {
                        gridMaster.getEl().unmask();
                    }
                };
                timer.schedule(1000);
            }
        }, "Atualizar"));

        gridMaster.addGridCellListener(new GridCellListenerAdapter(){
            public void onCellClick(GridPanel grid, int rowIndex, int colIndex, EventObject e){
                storeDetalhe.filter("IDF_Tarefa", grid.getSelectionModel().getSelected().getAsString("ID"));
            }
        });

        //Detalhes
        recordDefDetalhe = new RecordDef(new FieldDef[]{
            new IntegerFieldDef("ID"),
            new IntegerFieldDef("IDF_Tarefa"),
            new StringFieldDef("data"),
            new StringFieldDef("usuario"),
            new StringFieldDef("descricao"),            
            new StringFieldDef("observacao"),
        });

        storeDetalhe = new Store(recordDefDetalhe);
        gridDetalhe = new GridPanel();
        gridDetalhe.setStore(storeDetalhe);

        ColumnConfig[] columnsDetalhe = new ColumnConfig[]{
            new ColumnConfig("Data Ocorrência", "data", 120, true),
            new ColumnConfig("Usuário", "usuario", 130, true),
            new ColumnConfig("Descrição", "descricao", 250, true),
            new ColumnConfig("Observação", "observacao", 340, true),
        };

        ColumnModel columnModelDetalhe = new ColumnModel(columnsDetalhe);
        gridDetalhe.setColumnModel(columnModelDetalhe);
        gridDetalhe.setFrame(true);
        gridDetalhe.setTitle("Ocorrências Tarefa");
        gridDetalhe.setStripeRows(true);
        gridDetalhe.setSize(1020, 300);
        gridDetalhe.setAutoScroll(true);
        
        toolbar = getToolbar();
        toolbar.setSize(gridMaster.getWidth(), 30);

        this.add(toolbar);
        this.add(gridMaster);
        this.add(gridDetalhe);

        CarrgarGridMaster();
        CarrgarGridDetalhe();
    }

    private class CallBackRetTarefas implements AsyncCallback<ArrayList<Atividade_Roteiro>> {
	public void onFailure(Throwable e) {
		MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
	}
	public void onSuccess(ArrayList<Atividade_Roteiro> result) {
                CarregarDadosMaster(result);
                CarrgarGridDetalhe();
        }
    }

    private class CallBackRetOcoTarefas implements AsyncCallback<ArrayList<OcorrenciaTarefa>> {
	public void onFailure(Throwable e) {
		MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
	}
	public void onSuccess(ArrayList<OcorrenciaTarefa> result) {
                CarregarDadosDetalhe(result);
                storeDetalhe.filter("IDF_Tarefa", "VAZIO");
        }
    }

    private void CarregarDadosMaster(ArrayList<Atividade_Roteiro> result){
        ArrayTarefas = result;
        for (int i = 0; i < result.size(); ++i) {
            addRecordMaster(result.get(i));
        }
    }

    private void CarregarDadosDetalhe(ArrayList<OcorrenciaTarefa> result){
        ArrayOcorTarefas = result;
        for (int i = 0; i < result.size(); ++i) {
            addRecordDetalhe(result.get(i));
        }
    }

    public void CarrgarGridMaster(){
        //store.filter("status", "Aberta");
        storeMaster.removeAll();
        String sSQL = "select A.ID, A.Titulo, A.Descricao, B.Nick, "+
                      "A.IDF_Resp, A.Status, A.Data_entrega, D.Nome NmUnidade, D.ID IDF_Unidade, "+
                      "E.Nome NmProjeto "+
                      "from ATIVIDADE_ROTEIRO A "+
                      "inner join USUARIO B on B.ID = A.IDF_Resp "+
                      "inner join UNIDADE D on D.ID = A.IDF_Unidade "+
                      "inner join PROJETO E on E.ID = D.IDF_Projeto "+
                      "where ((A.Status = 'Aberta') or (A.Status = 'Com Problemas')) and (A.IDF_Resp = "+IDF_Usuario+")";
        controller.RetornarDadosTarefa(sSQL, new CallBackRetTarefas());
    }

    public void CarrgarGridDetalhe(){
        storeDetalhe.removeAll();
        String sSQL = "select * from OCORRENCIA_TAREFA A "+
                      "inner join Usuario B on B.ID = A.IDF_Usuario";
        controller.RetornarDadosOcoTarefa(sSQL, new CallBackRetOcoTarefas());
    }


    public void addRecordMaster(Atividade_Roteiro Tarefa){
        Object[] rowData = new Object[]{
          Tarefa.getId(),
          Tarefa.getIdf_unidade(),
          Tarefa.getNm_projeto(),
          Tarefa.getNm_unidade(),
          Tarefa.getTitulo(),
          Tarefa.getDescricao(),
          Tarefa.getData_entrega(),
          Tarefa.getResponsavel(),
          Tarefa.getStatus(),
          Tarefa.getIdf_responsavel(),
          Tarefa.getData_entrega_formatada(),
        };
        Record record = recordDefMaster.createRecord(rowData[0].toString(), rowData);
        storeMaster.add(record);
    }

    public void addRecordDetalhe(OcorrenciaTarefa OcoTarefa){
        Object[] rowData = new Object[]{
          OcoTarefa.getID(),
          OcoTarefa.getIDF_Tarefa(),
          OcoTarefa.getData(),
          OcoTarefa.getUsuario(),
          OcoTarefa.getDescricao(),
          OcoTarefa.getObservacao(),
        };
        Record record = recordDefDetalhe.createRecord(rowData[0].toString(), rowData);
        storeDetalhe.add(record);
    }

    public Toolbar getToolbar(){

        final AsyncCallback callbackTarefasStatus = new AsyncCallback() {
            public void onSuccess(Object result) {}
            public void onFailure(Throwable caught) {
               MessageBox.alert("Erro ", caught.getMessage()); }
        };

        final AsyncCallback callbackUnidadeStatus = new AsyncCallback() {
            public void onSuccess(Object result) {}
            public void onFailure(Throwable caught) {
               MessageBox.alert("Erro ", caught.getMessage()); }
        };

        final AsyncCallback callbackTarefasOcor = new AsyncCallback() {
            public void onSuccess(Object result) {}
            public void onFailure(Throwable caught) {
               MessageBox.alert("Erro ", caught.getMessage()); }
        };
        
        ToolbarButton btnAlteraStatus = new ToolbarButton();
        btnAlteraStatus.setText(" Assumir Tarefa");
        btnAlteraStatus.setIcon("Images/assumirTarefa.png");
        btnAlteraStatus.setTooltip("Permite assumir a tarefa");
        btnAlteraStatus.addListener(new ButtonListenerAdapter(){
            public void onClick(Button button, EventObject e){
                if (gridMaster.getSelectionModel().getSelected() == null){
                    MessageBox.alert("Necessário Selecionar Algum Registro! ");
                }else{
                    /*TarefasPanelAltStatus TarAltStatus = new TarefasPanelAltStatus(controller, self, gridMaster.getSelectionModel().getSelected().getAsInteger("ID"), IDF_Usuario);
                    TarAltStatus.show();
                    TarAltStatus.loadRecord(gridMaster.getSelectionModel().getSelected());*/
                    //altera o status da tarefa
                    String sSql = "Update ATIVIDADE_ROTEIRO set Status = 'Em Andamento' where ID = "+gridMaster.getSelectionModel().getSelected().getAsString("ID");
                    controller.EditarRegistro(sSql, callbackTarefasStatus);
                    //altera o status da unidade
                    sSql = "Update UNIDADE set Status = 'Em Andamento' where ID = "+gridMaster.getSelectionModel().getSelected().getAsString("IDF_Unidade");
                    controller.EditarRegistro(sSql, callbackUnidadeStatus);
                    
                    //Incluir ocorrencia de tarefa
                    //MessageBox.alert(data.toString());
                                   DateTimeFormat sdf = DateTimeFormat.getFormat("yyyy-MM-dd");

               String DataOco = sdf.format(new Date());
                    sSql = "insert into OCORRENCIA_TAREFA (IDF_Tarefa, IDF_Usuario, Descricao, Data) values "+
                            "("+gridMaster.getSelectionModel().getSelected().getAsString("ID")+", "+IDF_Usuario+", 'Status alterado para Em Andamento', '"+DataOco+"')";
                    controller.IncluirRegistro(sSql, callbackTarefasOcor);

                    //filtra o grid das tarefas
                    CarrgarGridMaster();                    
                }
            }
        });

        Toolbar toobar = new Toolbar();
        toobar.addButton(btnAlteraStatus);

        return toobar;
    }

}
